{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "02638847",
   "metadata": {},
   "source": [
    "# 机器学习算法公式总结"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70ecb205",
   "metadata": {},
   "source": [
    "### 一元一次线性回归公式为：\n",
    "\n",
    "y = ax + b，其中a为斜率，b为截距。\n",
    "\n",
    "解析：\n",
    "1. 首先，我们需要收集数据点（x, y）。\n",
    "2. 然后，计算所有数据点的x和y的平均值。\n",
    "3. 接下来，计算斜率a，即数据点之间的x差的平均值与y差的平均值之比。\n",
    "4. 最后，计算截距b，即y轴上的截距，即y轴上所有数据点的平均值减去斜率a乘以x轴上所有数据点的平均值。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7c19378",
   "metadata": {},
   "source": [
    "### 多元一次线性回归公式为：\n",
    "\n",
    "$$\n",
    "y = \\beta_0 + \\beta_1x_1 + \\beta_2x_2 + ... + \\beta_nx_n + \\epsilon\n",
    "$$\n",
    "\n",
    "其中，$y$ 是因变量，$x_1, x_2, ..., x_n$ 是自变量，$\\beta_0, \\beta_1, ..., \\beta_n$ 是回归系数，$\\epsilon$ 是误差项。\n",
    "\n",
    "解析：这个公式表示的是一个多元线性回归模型，其中 $y$ 是因变量，$x_1, x_2, ..., x_n$ 是自变量，回归系数 $\\beta_0, \\beta_1, ..., \\beta_n$ 分别表示每个自变量对因变量的影响程度，误差项 $\\epsilon$ 表示观测值与预测值之间的差异。通过最小化误差项的平方和，可以得到最优的回归系数，从而得到一个拟合效果较好的多元线性回归模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b0018d6",
   "metadata": {},
   "source": [
    "### 多项式线性回归公式为：\n",
    "\n",
    "$$\n",
    "y = \\beta_0 + \\beta_1x_1 + \\beta_2x_2 + ... + \\beta_px_p + \\epsilon\n",
    "$$\n",
    "\n",
    "其中，$y$ 是因变量，$x_1, x_2, ..., x_p$ 是自变量，$\\beta_0, \\beta_1, ..., \\beta_p$ 是回归系数，$\\epsilon$ 是误差项。\n",
    "\n",
    "解析：\n",
    "\n",
    "1. 首先，我们需要将自变量进行多项式扩展，得到 $x_1, x_2, ..., x_p$ 的多项式表示。例如，如果 $x_1, x_2$ 是自变量，我们可以将它们表示为 $x_1, x_2, x_1x_2, x_1^2, x_2^2$ 等。\n",
    "\n",
    "2. 然后，我们需要构建一个矩阵 $X$，其中每一列是一个自变量的多项式表示。例如，对于上面的多项式表示，我们可以构建以下矩阵：\n",
    "\n",
    "$$\n",
    "X = \\begin{bmatrix}\n",
    "1 & x_1 & x_2 & x_1x_2 & x_1^2 & x_2^2 \\\\n0 & 1 & 0 & 0 & 1 & 0 \\\\n... & ... & ... & ... & ... & ... \\\\n\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "3. 接下来，我们需要求解回归系数 $\\beta_0, \\beta_1, ..., \\beta_p$。这可以通过最小二乘法来实现。具体来说，我们可以通过以下公式计算回归系数：\n",
    "\n",
    "$$\n",
    "\\beta = (X^T X)^{-1} X^T y\n",
    "$$\n",
    "\n",
    "其中，$X^T$ 是矩阵 $X$ 的转置，$(X^T X)^{-1}$ 是矩阵 $X^T X$ 的逆矩阵。\n",
    "\n",
    "4. 最后，我们可以得到多项式线性回归模型：\n",
    "\n",
    "$$\n",
    "y = \\beta_0 + \\beta_1x_1 + \\beta_2x_2 + ... + \\beta_px_p + \\epsilon\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34fcedd0",
   "metadata": {},
   "source": [
    "### VIF（Variance Inflation Factor，方差膨胀因子）\n",
    "\n",
    "是一种衡量多重共线性的统计指标。在回归分析中，如果一个自变量与多个其他自变量高度相关，那么这个自变量就存在多重共线性问题。\n",
    "\n",
    "VIF的计算公式为：\n",
    "\n",
    "VIF = 1 / (1 - R²)\n",
    "\n",
    "其中，R²表示自变量与其他自变量的相关系数平方和。\n",
    "\n",
    "LaTeX语法表示如下：\n",
    "\n",
    "\\[ VIF = \\frac{1}{1 - R^2} \\]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92bbe4a9",
   "metadata": {},
   "source": [
    "### 岭回归（Ridge Regression）\n",
    "是一种线性回归的改进方法，它通过在损失函数中添加一个L2正则项（权重系数的平方和）来防止过拟合。岭回归的公式如下：\n",
    "\n",
    "给定训练数据集 $X$ 和对应的目标值 $y$，岭回归的损失函数可以表示为：\n",
    "\n",
    "$$ J(\\theta) = \\frac{1}{2m} \\sum_{i=1}^{m} (h_\\theta(x^{(i)}) - y^{(i)})^2 + \\lambda \\sum_{j=1}^{n} \\theta_j^2 $$\n",
    "\n",
    "其中，$m$ 是训练样本的数量，$n$ 是特征的数量，$\\theta$ 是模型参数向量，$h_\\theta(x^{(i)})$ 是预测值，$\\lambda$ 是正则化系数。\n",
    "\n",
    "为了求解最优的模型参数向量 $\\theta$，我们可以使用梯度下降法。根据损失函数的一阶导数，我们可以得到以下更新规则：\n",
    "\n",
    "$$ \\theta_j := \\theta_j - \\alpha \\left( \\frac{\\partial J}{\\partial \\theta_j} + \\lambda \\theta_j \\right) $$\n",
    "\n",
    "其中，$\\alpha$ 是学习率，$\\frac{\\partial J}{\\partial \\theta_j}$ 是损失函数关于第 $j$ 个参数的偏导数。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1299aadf",
   "metadata": {},
   "source": [
    "### Lasso回归（Least Absolute Shrinkage and Selection Operator）\n",
    "\n",
    "是一种线性回归的正则化方法，它通过在损失函数中添加一个L1正则项（权重系数的绝对值之和）来控制模型的复杂度。Lasso回归的公式如下：\n",
    "\n",
    "给定训练数据集 $X$ 和对应的目标值 $y$，Lasso回归的损失函数可以表示为：\n",
    "\n",
    "$$ J(\\beta) = \\frac{1}{2m} \\sum_{i=1}^{m} (y^{(i)} - X\\beta^{(i)})^2 + \\lambda \\sum_{j=1}^{n} |\\beta_j| $$\n",
    "\n",
    "其中，$m$ 是训练样本的数量，$n$ 是特征的数量，$\\beta$ 是模型参数向量，$X$ 是设计矩阵，$y^{(i)}$ 是第 $i$ 个样本的目标值，$\\lambda$ 是正则化系数。\n",
    "\n",
    "为了求解最优的模型参数向量 $\\beta$，我们可以使用梯度下降法。根据损失函数的一阶导数，我们可以得到以下更新规则：\n",
    "\n",
    "$$ \\beta_j := \\beta_j - alpha \\left( \\frac{\\partial J}{\\partial \\beta_j} + \\lambda \\sign(\\beta_j) \\right)$$\n",
    "\n",
    "其中，$\\alpha$ 是学习率，$\\frac{\\partial J}{\\partial \\beta_j}$ 是损失函数关于第 $j$ 个参数的偏导数，$\\sign(\\beta_j)$ 是第 $j$ 个参数的符号函数。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c4b3f98",
   "metadata": {},
   "source": [
    "### 逻辑回归（Logistic Regression）\n",
    "\n",
    "是一种分类算法，主要用于解决二分类问题。其公式为：\n",
    "\n",
    "$$ p(y=1) = \\frac{1}{1 + e^{-(\\beta_0 + \\beta_1 x_1 + \\beta_2 x_2 + ... + \\beta_n x_n)}} $$\n",
    "\n",
    "其中，$y$ 是因变量（标签），取值为0或1；$x_1, x_2, ..., x_n$ 是自变量（特征）；$\\beta_0, \\beta_1, ..., \\beta_n$ 是模型参数，需要通过训练数据进行学习得到。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af89d724",
   "metadata": {},
   "source": [
    "### 决策树算法的公式如下：\n",
    "\n",
    "设数据集为 $D = \\{x_1, x_2, \\cdots, x_n\\}$，其中每个样本 $x_i$ 是一个 $m$ 维向量，表示其特征值。假设我们用 $y_i$ 来表示样本 $x_i$ 所属的类别标签。\n",
    "\n",
    "首先，我们需要定义一个划分函数 $T(x)$，用来将数据集划分为两个子集，其中一个子集包含所有属于某个类别的样本，另一个子集包含其余样本。具体而言，对于给定的特征 $a$ 和阈值 $t$，划分函数 $T(x)$ 的定义如下：\n",
    "\n",
    "$$T(x) = \\{x_i | x_{ai} < t\\}$$\n",
    "\n",
    "其中，$x_{ai}$ 表示样本 $x_i$ 在特征 $a$ 上的取值。\n",
    "\n",
    "接下来，我们需要定义一个基尼指数函数 $G(D)$，用来度量数据集 $D$ 的纯度。具体而言，对于给定的数据集 $D$，基尼指数函数 $G(D)$ 的定义如下：\n",
    "\n",
    "$$G(D) = 1 - \\sum_{k=1}^{K} p_k^2$$\n",
    "\n",
    "其中，$p_k$ 表示样本集中属于类别 $k$ 的样本所占的比例，$K$ 表示类别的数量。\n",
    "\n",
    "最后，我们需要定义一个决策树节点 $T_i$，用来表示决策树中的一个节点。具体而言，对于给定的数据集 $D$ 和一个特征集合 $A$，决策树节点 $T_i$ 的定义如下：\n",
    "\n",
    "$$T_i = \\begin{cases} \n",
    "T_{left} & \\text{if } T_{i}(x) \\in A \\\\\n",
    "\\text{叶节点} & \\text{if } T_{i}(x) \\notin A \\\\\n",
    "\\end{cases}$$\n",
    "\n",
    "其中，$T_{left}$ 表示左子树，$T_{right}$ 表示右子树，$T_{i}(x)$ 表示以特征 $a$ 和阈值 $t$ 划分数据集 $D$ 后得到的子集。如果 $T_{i}(x)$ 不属于特征集合 $A$，则该节点为叶节点，表示该节点对应的分类结果。\n",
    "\n",
    "根据以上定义，我们可以使用递归的方式构建决策树。具体而言，从根节点开始，每次选择一个未被使用的特征 $a$ 和阈值 $t$，将数据集 $D$ 划分为两个子集 $D_1$ 和 $D_2$，分别计算它们的基尼指数 $G(D_1)$ 和 $G(D_2)$，选择使得基尼指数最小的划分方式作为当前节点的划分方式，并递归地构建左子树和右子树。当某个特征集 $A$ 中的所有特征都被使用过或者无法进一步划分数据集时，停止递归，返回叶节点。最终得到的决策树即为所求。\n",
    "\n",
    "### 随机森林算法\n",
    "\n",
    "是一种集成学习方法，它通过构建多个决策树并将它们的预测结果进行投票来得到最终的预测结果。随机森林算法的主要公式如下：\n",
    "\n",
    "1. 对于给定的训练数据集D，随机森林算法会构建m个决策树。\n",
    "2. 对于每个决策树i，从训练数据集中随机抽取n个样本（n >= sqrt(m)），作为该决策树的训练数据集。\n",
    "3. 使用这些训练数据集分别训练决策树i。\n",
    "4. 对于一个新的输入x，随机森林算法会对每个决策树进行预测，并收集所有决策树的预测结果。\n",
    "5. 最后，随机森林算法会根据收集到的预测结果进行投票，得到最终的预测结果。\n",
    "\n",
    "以下是用LaTeX语法表达的随机森林算法公式：\n",
    "\n",
    "1. 构建m个决策树：\n",
    "\n",
    "$$M = \\text{build}(D, m)$$\n",
    "\n",
    "\n",
    "2. 对每个决策树i进行训练：\n",
    "$$I = \\text{train}(D_i, n)$$\n",
    "\n",
    "3. 对新的输入x进行预测：\n",
    "$$\\hat{y}_i = I_i(\\mathbf{x})$$\n",
    "\n",
    "4. 对所有决策树进行预测：\n",
    "$$\\hat{y} = \\left( \\frac{1}{m} \\sum_{i=1}^{m} \\hat{y}_i \\right)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6109c743",
   "metadata": {},
   "source": [
    "### Adaboost（自适应增强）算法\n",
    "\n",
    "即自适应增强算法，是一种集成学习的算法。其核心思想是通过对训练数据集进行重新加权，使得前一个基础分类器分错的样本在后一个基础分类器中得到更多的关注，同时减小前一个分类器分对的样本在后一个分类器中的关注。此外，该算法会赋予每个弱分类器一个权重系数，这个权重系数体现了这个弱分类器的性能好坏。\n",
    "\n",
    "Adaboost算法公式如下：\n",
    "\n",
    "1. 初始化训练数据的权重分布：$D_1(x)=\\frac{1}{N}, x=1,2,...,N$；\n",
    "2. 迭代过程开始：\n",
    "    a. 计算弱分类器$h_t(x)$的错误率：$e_t=\\sum_{i=1}^{N}D_t(xi)h_t(xi)$；\n",
    "    b. 计算弱分类器$h_t(x)$的权重：$w_t=\\frac{1}{2}\\log(\\frac{1-e_t}{e_t})$；\n",
    "    c. 更新训练数据的权重分布：$D_{t+1}(x)=D_t(x)times exp({-y_txh_t(x)}), x=1,2,...,N$；\n",
    "3. 迭代直到弱分类器的权重小于预设的阈值或达到预设的最大迭代次数；\n",
    "4. 结合所有弱分类器：$H(x)=\\sum_{t=1}^{T}w_th_t(x)$；\n",
    "5. 得到最终的强分类器：$G(x)=sign[H(x)]$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f3bacb5",
   "metadata": {},
   "source": [
    "### XGBoost算法公式如下：\n",
    "\n",
    "$f(x_i, \\theta) = f(x_i, \\theta_{t-1}) + f(x_i, \\theta_t)$\n",
    "\n",
    "其中，$f(x_i, \\theta_{t-1})$ 表示第 $t-1$ 步的模型对样本 $x_i$ 的预测值，$f(x_i, \\theta_t)$ 表示第 $t$ 步的模型对样本 $x_i$ 的预测值。\n",
    "\n",
    "在目标函数中，我们需要考虑正则化项来防止过拟合。正则化项可以使用泰勒公式进行近似展开，从而将常数项和线性项抽离出来，进一步简化目标函数。\n",
    "\n",
    "需要注意的是，XGBoost采用的是基于特征的并行计算，所以在每次计算之前，都要对特征进行排序。这样的算法需要保存数据的特征值，还保存了特征排序的结果（例如排序后的索引），为了后续快速的计算分割点。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9b56661",
   "metadata": {},
   "source": [
    "### Gradient Boosting算法公式如下：\n",
    "\n",
    "$f(x_i, \\theta) = f(x_i, \\theta_{t-1}) + f(x_i, \\theta_t)$\n",
    "\n",
    "其中，$f(x_i, \\theta_{t-1})$ 表示第 $t-1$ 步的模型对样本 $x_i$ 的预测值，$f(x_i, \\theta_t)$ 表示第 $t$ 步的模型对样本 $x_i$ 的预测值。\n",
    "\n",
    "在目标函数中，我们需要考虑正则化项来防止过拟合。正则化项可以使用泰勒公式进行近似展开，从而将常数项和线性项抽离出来，进一步简化目标函数。\n",
    "\n",
    "需要注意的是，Gradient Boosting采用的是基于特征的并行计算，所以在每次计算之前，都要对特征进行排序。这样的算法需要保存数据的特征值，还保存了特征排序的结果（例如排序后的索引），为了后续快速的计算分割点。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70265dbb",
   "metadata": {},
   "source": [
    "### KNN算法的公式可以表示为：\n",
    "\n",
    "$$y_{pred} = \\arg \\min_i \\left( \\sum_{j=1}^{k} d(x, x_j) \\right)$$\n",
    "\n",
    "其中，$y_{pred}$ 是预测的类别标签，$d(x, x_j)$ 是样本 $x$ 和训练集中第 $j$ 个样本之间的欧氏距离。\n",
    "\n",
    "解析：\n",
    "\n",
    "1. 对于给定的测试样本 $x$，计算它与训练集中每个样本的距离 $d(x, x_j)$。\n",
    "2. 选择距离最近的 $k$ 个样本，即找到距离最小的 $k$ 个样本。\n",
    "3. 统计这 $k$ 个样本中出现最多的类别标签，并将其作为预测结果 $y_{pred}$。\n",
    "\n",
    "需要注意的是，KNN算法中的 $k$ 值需要事先确定，通常可以通过交叉验证等方法来确定最优的 $k$ 值。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bbff075d",
   "metadata": {},
   "source": [
    "### 支持向量机（SVM）算法\n",
    "\n",
    "支持向量机（SVM）算法的核心思想是找到一个超平面，使得两个类别之间的间隔最大化。这个超平面被称为最优分割超平面。支持向量机算法的公式如下：\n",
    "\n",
    "1. 定义损失函数：$$ L(w) = 0.5 * ||w^T * x - y||^2 + C * sum(α_i)$$ 其中α_i是拉格朗日乘子，C是惩罚系数。\n",
    "\n",
    "2. 对损失函数求偏导数：$$ dL/dα_i = 0, dL/dα_j = 0, dL/dβ = 0, dL/dw = 0$$ \n",
    "\n",
    "3. 使用二次规划求解拉格朗日乘子α_i 和β：$$ α_i = max(0, α_i - y_i * (x_i^T * w + β)), α_j = min(C, α_j - y_j * (x_j^T * w + β))$$\n",
    "\n",
    "$$β = max(0, β - ∑α_i * y_i * (x_i^T * x_j + 1))$$ \n",
    "\n",
    "4. 更新权重向量w：$$ w = w - η * ∇L(w)$$ 其中η是学习率\n",
    "\n",
    "5. 重复步骤3和4直到满足收敛条件。\n",
    "\n",
    "注解：\n",
    "\n",
    "- L(w)是损失函数，表示在给定权重向量w的情况下，预测结果与实际结果之间的平方误差之和。\n",
    "- α_i和α_j是拉格朗日乘子，用于平衡两个类别之间的间隔。\n",
    "- β是松弛变量，用于处理线性不可分的情况。\n",
    "- η是学习率，控制权重向量w的更新步长。\n",
    "- ∇L(w)是损失函数的梯度，表示权重向量w的变化方向。\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04c4eaa9",
   "metadata": {},
   "source": [
    "### 贝叶斯算法\n",
    "\n",
    "是一种基于概率的分类算法，它通过计算先验概率和后验概率来进行分类。贝叶斯公式是该算法的核心公式，其表达式如下：\n",
    "\n",
    "$$P(A|B)=\\frac{P(B|A)P(A)}{P(B)}$$\n",
    "\n",
    "其中，$P(A|B)$表示在事件B发生的条件下事件A发生的概率，即后验概率；$P(B|A)$表示在事件A发生的条件下事件B发生的概率，即条件概率；$P(A)$和$P(B)$分别表示事件A和事件B的先验概率。\n",
    "\n",
    "注解：\n",
    "\n",
    "- 先验概率是指在已知某些信息的情况下，事件发生的概率。在贝叶斯算法中，先验概率通常通过历史数据或者专家经验来获得。\n",
    "- 条件概率是指在已知某一事件发生的条件下，另一事件发生的概率。在贝叶斯算法中，条件概率通常通过训练数据集来获得。\n",
    "- 后验概率是指在某个事件发生的条件下，另一个事件发生的概率。它是贝叶斯算法中最重要的概念之一，通常通过贝叶斯公式来计算。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f69fae19",
   "metadata": {},
   "source": [
    "### K-Means聚类算法\n",
    "\n",
    "是一种无监督学习方法，其基本思想是通过迭代计算，将数据集划分为K个簇。算法的主要步骤如下：\n",
    "\n",
    "1. 初始化：选择K个初始质心（可以随机选择数据集中的数据点作为初始质心）。\n",
    "2. 分配：将每个数据点分配到距离其最近的质心所在的簇。\n",
    "3. 更新：重新计算每个簇的质心，即簇内所有数据点的均值。\n",
    "4. 重复步骤2和3，直到质心不再发生变化或达到最大迭代次数。\n",
    "\n",
    "K-Means算法的LaTeX公式表示如下：\n",
    "\n",
    "1. 初始化：选择K个初始质心。设数据集为$X = \\{x_1, x_2, ..., x_n\\}$，其中$x_i = (x_{i1}, x_{i2}, ..., x_{in})$是第i个数据点的特征向量。假设我们已经从数据集中随机选择了K个数据点作为初始质心，记作$C_1, C_2, ..., C_k$。\n",
    "\n",
    "2. 分配：对于每个数据点$x_i$，计算它与各个质心的距离，并将其分配到距离最近的质心所在的簇。设$c_j$是第j个簇，那么$x_i$属于簇$c_j$。\n",
    "\n",
    "   距离计算公式为：\n",
    "   $$d(x_i, c_j) = \\sqrt{\\sum_{d=1}^{n} (x_{i1} - C_{j1})^{2} + \\sum_{d=1}^{n} (x_{i2} - C_{j2})^{2} + ... + \\sum_{d=1}^{n} (xi - C_{jd})^{2}}$$\n",
    "\n",
    "3. 更新：重新计算每个簇的质心。设$c_j$是第j个簇，那么新的质心$C_{j}$可以通过以下公式计算：\n",
    "   $$C_{j} = \\left(\\begin{array}{c}\n",
    "   \\frac{\\sum_{i=1}^{n} x_{ij}(x_{ij} - C_{j1})}{N_j} \\\\\n",
    "   \\frac{\\sum_{i=1}^{n} x_{ij}(x_{ij} - C_{j2})}{N_j} \\\\\n",
    "   ... \\\\\n",
    "   \\frac{\\sum_{i=1}^{n} x_{ij}(x_{ij} - C_{jd})}{N_j}\n",
    "   \\end{array}\\right)$$\n",
    "   其中，$N_j$是簇$c_j$中数据点的数量，$x_{ij}$是第i个数据点的第j个特征值。\n",
    "\n",
    "4. 重复步骤2和3，直到质心不再发生变化或达到最大迭代次数。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a71800ed",
   "metadata": {},
   "source": [
    "### 层次聚类算法\n",
    "\n",
    "主要包括两种：凝聚式（Agglomerative）和分裂式（Divisive）。这里以凝聚式为例，介绍其公式及注解。\n",
    "\n",
    "1. 最小距离法（Single-linkage）：计算簇内各点之间的距离，取最小值作为簇间的距离。\n",
    "\n",
    "2. 最大距离法（Complete-linkage）：计算簇内各点之间的距离，取最大值作为簇间的距离。\n",
    "\n",
    "3. 平均距离法（Average-linkage）：计算簇内各点之间的距离，取平均值作为簇间的距离。\n",
    "\n",
    "4. 中心距离法（Ward's method）：计算簇内各点之间的距离，加上簇间的距离的平方和的倒数作为簇间的距离。\n",
    "\n",
    "层次聚类算法的公式表示如下：\n",
    "\n",
    "1. 最小距离法（Single-linkage）：\n",
    "\n",
    "$$d_{ij} = \\min_{k \\in C_i} \\min_{l \\in C_j} d(x_k, x_l)$$\n",
    "\n",
    "其中，$C_i$ 和 $C_j$ 分别表示两个簇，$d(x_k, x_l)$ 表示 $x_k$ 和 $x_l$ 之间的距离。\n",
    "\n",
    "2. 最大距离法（Complete-linkage）：\n",
    "\n",
    "$$d_{ij} = \\max_{k \\in C_i} \\max_{l \\in C_j} d(x_k, x_l)$$\n",
    "\n",
    "3. 平均距离法（Average-linkage）：\n",
    "\n",
    "$$d_{ij} = \\frac{1}{n_i + n_j} \\sum_{k \\in C_i} \\sum_{l \\in C_j} d(x_k, x_l)$$\n",
    "\n",
    "其中，$n_i$ 和 $n_j$ 分别表示 $C_i$ 和 $C_j$ 中的元素个数。\n",
    "\n",
    "4. 中心距离法（Ward's method）：\n",
    "\n",
    "$$d_{ij} = \\sum_{k \\in C_i} \\sum_{l \\in C_j} d^2(x_k, x_l) / (n_i * n_j)$$\n",
    "\n",
    "其中，$d^2(x_k, x_l)$ 表示 $x_k$ 和 $x_l$ 之间的平方距离。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0cee3f5",
   "metadata": {},
   "source": [
    "### DBSCAN（Density-Based Spatial Clustering of Applications with Noise）算法\n",
    "\n",
    "是一种基于密度的聚类算法，它可以找到任意形状的簇，并且能够识别噪声点。DBSCAN算法的主要公式如下：\n",
    "\n",
    "$$\n",
    "D(p, q) = \\sqrt{(p_1 - q_1)^2 + (p_2 - q_2)^2 + ... + (p_n - q_n)^2}\n",
    "$$\n",
    "\n",
    "其中，$p$和$q$是两个数据点，$D(p, q)$表示它们之间的欧几里得距离。\n",
    "\n",
    "DBSCAN算法的基本步骤如下：\n",
    "\n",
    "1. 选择一个半径ε和一个最小样本数MinPts。\n",
    "2. 对于数据集中的每个点，如果它的ε邻域内至少有MinPts个点，则将其标记为核心对象；否则，将其标记为噪声点。\n",
    "3. 对于每个核心对象，找到其ε邻域内的所有点，并将它们合并到一个簇中。重复此过程，直到所有点都被分配到某个簇中。\n",
    "4. 如果一个噪声点在多个簇的ε邻域内，则将其分配到距离它最近的簇中。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8771e673",
   "metadata": {},
   "source": [
    "### PCA（Principal Component Analysis）算法\n",
    "\n",
    "是一种常用的无监督学习算法，用于精简高维数据。它的主要思想是通过线性变换将原始数据投影到新的坐标系中，使得新坐标系的基向量尽可能接近于原始数据的协方差矩阵的特征向量。\n",
    "\n",
    "PCA算法的基本步骤如下：\n",
    "\n",
    "1. 计算原始数据的均值和协方差矩阵。\n",
    "2. 对协方差矩阵进行特征值分解，得到特征值和特征向量。\n",
    "3. 选择前k个最大的特征值对应的特征向量，构成一个投影矩阵。\n",
    "4. 将原始数据乘以投影矩阵，得到降维后的数据。\n",
    "\n",
    "以下是使用LaTeX语法表达的PCA算法公式及注解：\n",
    "\n",
    "1. 计算原始数据的均值和协方差矩阵：\n",
    "\n",
    "$$\n",
    "\\begin{align*}\n",
    "\\mu_x &= \\frac{1}{n} \\sum_{i=1}^{n} x_i \\\\\n",
    "\\mu_y &= \\frac{1}{n} \\sum_{i=1}^{n} y_i \\\\\n",
    "Cov(x, y) &= \\frac{1}{n-1} \\sum_{i=1}^{n} (x_i - \\mu_x)(y_i - \\mu_y) \\\\\n",
    "\\end{align*}\n",
    "$$\n",
    "\n",
    "其中，$x_i$和$y_i$是原始数据中的第$i$个样本，$n$是样本总数。\n",
    "\n",
    "2. 对协方差矩阵进行特征值分解：\n",
    "\n",
    "$$\n",
    "\\begin{align*}\n",
    "Cov(X) = \\begin{bmatrix} C_{11} & C_{12} & ... & C_{1m} \\\\ C_{21} & C_{22} & ... & C_{2m} \\\\ ... & ... & ... & C_{mm} \\end{bmatrix} \\\\\n",
    "&= \\begin{bmatrix} \\lambda_1 & 0 & ... & 0 \\\\ 0 & \\lambda_2 & ... & 0 \\\\ ... & ... & ... & \\lambda_m \\end{bmatrix} \\\\\n",
    "&= V \\Lambda V^{-1} \\\\\n",
    "\\end{align*}\n",
    "$$\n",
    "\n",
    "其中，$V$是协方差矩阵的特征向量组成的矩阵，$\\Lambda$是对角矩阵，其对角线上的元素为协方差矩阵的特征值。\n",
    "\n",
    "3. 选择前k个最大的特征值对应的特征向量，构成一个投影矩阵：\n",
    "\n",
    "$$\n",
    "P = V_{1:k} \\\\\n",
    "$$\n",
    "\n",
    "其中，$V_{1:k}$表示矩阵$V$的前$k$列。\n",
    "\n",
    "4. 将原始数据乘以投影矩阵，得到降维后的数据：\n",
    "\n",
    "$$\n",
    "X' = P^T X \\\\\n",
    "$$\n",
    "\n",
    "其中，$X'$是降维后的数据，$X$是原始数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cfccda7b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
